package org.chnxi.study.leetcode.questions25.ques6;

/**
 * z字形的每个顶点，是按照固定倍数增长的，并且同一行相加的值等于下一个顶点，参照此规律
 * 执行用时 :3 ms, 在所有 Java 提交中击败了99.34%的用户
 * 内存消耗 :39.5 MB, 在所有 Java 提交中击败了11.67%的用户
 */
public class Simple1 {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i =97; i<=122; i++){
            sb.append((char)i);
        }
        String str = "PAYPALISHIRING";//sb.toString();
        System.out.println(str);
        int numRows = 3;

        String result = convert(str , numRows);
        System.out.println(result);

    }

    public static String convert(String s, int numRows) {
        if(s == null || (s = s.trim()).length() < 1){
            return "";
        }
        //当numRows为1时，不进行处理
        if(numRows == 1){
            return s;
        }

        int len = s.length();
        //StringBuilder sb = new StringBuilder();
        char[] rsChar = new char[len];//收集结果
        int rsCharIdx = 0;//放入时的索引，按顺序放入
        int step = 2 * numRows - 2; //计算时用的步长

        for (int i=0; i<numRows; i++){

            int col = 0;

            while (true){
                //获取Z字形左边索引位
                int index = col * step + i;
                if(index > len-1){
                    break;
                }
                rsChar[rsCharIdx] = s.charAt(index);
                rsCharIdx++;

                //如果不是首行与尾行，需要拼接Z字形斜边上的值
                if(i != 0 && i!= numRows-1){
                    //获取Z字形左边顶点索引
                    int val1 = col * step;
                    //获取Z字形右边顶点索引
                    int val2 = (col+1)*step;
                    //获取当前斜边上的索引
                    int otherIndex = val1 + val2 - index;
                    if(otherIndex>len-1){
                        break;
                    }
                    rsChar[rsCharIdx] = s.charAt(otherIndex);
                    rsCharIdx++;
                }
                col++;
            }
        }

        return new String(rsChar);
    }

}
